#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Если Параметры.Свойство("РежимЗапуска") Тогда
		//@skip-check unknown-form-parameter-access
		РежимРаботы = Параметры.РежимЗапуска;
	Иначе
		РежимРаботы = -1;
	КонецЕсли;
	
	ДоступныеНаборыТипов = УИ_ОбщегоНазначенияКлиентСервер.ДоступныеНаборыТиповДляРедактирования();
	
	//Набор типов можт содержать значения
	// Ссылки
	// СоставныеСсылки
	// Примитивные
	// Null
	// ХранилищеЗначений
	// КоллекцииЗначений 
	// МоментВремени
	// Тип
	// Граница
	// УникальныйИдентификатор
	// СтандартныйПериод
	// СистемныеПеречисления
	
	НаборТипов.Очистить();
	
	Если РежимРаботы = 0 Тогда
		НаборТипов.Добавить(ДоступныеНаборыТипов.Ссылки);
		НаборТипов.Добавить(ДоступныеНаборыТипов.СоставныеСсылки);
		НаборТипов.Добавить(ДоступныеНаборыТипов.Примитивные);
		НаборТипов.Добавить(ДоступныеНаборыТипов.ХранилищеЗначения);
		НаборТипов.Добавить(ДоступныеНаборыТипов.УникальныйИдентификатор);
	ИначеЕсли РежимРаботы = 1 Тогда 
		НаборТипов.Добавить(ДоступныеНаборыТипов.Ссылки);
		НаборТипов.Добавить(ДоступныеНаборыТипов.СоставныеСсылки);
		НаборТипов.Добавить(ДоступныеНаборыТипов.Примитивные);
		НаборТипов.Добавить(ДоступныеНаборыТипов.ХранилищеЗначения);
		НаборТипов.Добавить(ДоступныеНаборыТипов.УникальныйИдентификатор);
		НаборТипов.Добавить(ДоступныеНаборыТипов.КоллекцииЗначений);
		НаборТипов.Добавить(ДоступныеНаборыТипов.МоментВремени);
		НаборТипов.Добавить(ДоступныеНаборыТипов.Тип);
		НаборТипов.Добавить(ДоступныеНаборыТипов.Граница);
		НаборТипов.Добавить(ДоступныеНаборыТипов.УникальныйИдентификатор);
		НаборТипов.Добавить(ДоступныеНаборыТипов.Null);
	ИначеЕсли РежимРаботы = 2 Тогда 
		НаборТипов.Добавить(ДоступныеНаборыТипов.Ссылки);
		НаборТипов.Добавить(ДоступныеНаборыТипов.СоставныеСсылки);
		НаборТипов.Добавить(ДоступныеНаборыТипов.Примитивные);
		НаборТипов.Добавить(ДоступныеНаборыТипов.ХранилищеЗначения);
		НаборТипов.Добавить(ДоступныеНаборыТипов.УникальныйИдентификатор);
		НаборТипов.Добавить(ДоступныеНаборыТипов.Null);
	ИначеЕсли РежимРаботы = 3 Тогда 
		НаборТипов.Добавить(ДоступныеНаборыТипов.Ссылки);
		НаборТипов.Добавить(ДоступныеНаборыТипов.СоставныеСсылки);
		НаборТипов.Добавить(ДоступныеНаборыТипов.Примитивные);
		НаборТипов.Добавить(ДоступныеНаборыТипов.ХранилищеЗначения);
		НаборТипов.Добавить(ДоступныеНаборыТипов.УникальныйИдентификатор);
		НаборТипов.Добавить(ДоступныеНаборыТипов.Null);
		НаборТипов.Добавить(ДоступныеНаборыТипов.СтандартныйПериод);
		НаборТипов.Добавить(ДоступныеНаборыТипов.СистемныеПеречисления);
	ИначеЕсли Параметры.Свойство("НаборТипов") Тогда
		//@skip-check unknown-form-parameter-access
		ВременныеНаборТипов = Параметры.НаборТипов;
		Если ТипЗнч(ВременныеНаборТипов) = Тип("Строка") Тогда
			ВременныйМассивТипов = СтрРазделить(ВременныеНаборТипов, ",");
			Для Каждого ТекНабор Из ВременныйМассивТипов Цикл
				НаборТипов.Добавить(ВРег(ТекНабор));
			КонецЦикла;
		ИначеЕсли ТипЗнч(ВременныеНаборТипов) = Тип("СписокЗначений") Тогда
			Для Каждого ТекНабор Из ВременныеНаборТипов Цикл
				НаборТипов.Добавить(ВРег(ТекНабор.Значение));
			КонецЦикла;

		ИначеЕсли ТипЗнч(ВременныеНаборТипов) = Тип("Массив") Тогда
			Для Каждого ТекНабор Из ВременныеНаборТипов Цикл
				НаборТипов.Добавить(ВРег(ТекНабор));
			КонецЦикла;
		КонецЕсли;
	КонецЕсли;
		
	НачальныйТипДанных = Новый ОписаниеТипов;
	Если Параметры.Свойство("ТипДанных") Тогда
		//@skip-check unknown-form-parameter-access
		ТипДанных=Параметры.ТипДанных;
		Если ТипЗнч(ТипДанных) = Тип("ОписаниеТипов") Тогда
			НачальныйТипДанных=ТипДанных;
		ИначеЕсли ТипЗнч(ТипДанных) = Тип("Строка") Тогда 
			//@skip-check empty-except-statement
			Попытка
				НачальныйТипДанных = УИ_ОбщегоНазначения.ЗначениеИзСтрокиXML(ТипДанных, Тип("ОписаниеТипов"));
			Исключение
			КонецПопытки;
		КонецЕсли;
	ИначеЕсли Параметры.Свойство("ХранилищеКонтейнераЗначенияТипа") Тогда 
		ВозвратХранилищаДляКонтейнераЗначения = Истина;
		ТипКонтейнераЗначения = УИ_ОбщегоНазначенияКлиентСервер.ТипыКонтейнеровЗначения().Тип;
		//@skip-check unknown-form-parameter-access
		ХранилищеКонтейнера = Параметры.ХранилищеКонтейнераЗначенияТипа;//см. УИ_ОбщегоНазначенияКлиентСервер.НовыйХранилищеЗначенияТипа
		Если ХранилищеКонтейнера <> Неопределено Тогда
			Попытка
				ТипДанныхКонтейнера = ЗначениеИзСтрокиВнутр(ХранилищеКонтейнера.Значение);
				МассивТиповДляОписания = Новый Массив();
				МассивТиповДляОписания.Добавить(ТипДанныхКонтейнера);
				НачальныйТипДанных = Новый ОписаниеТипов(МассивТиповДляОписания);
			Исключение
				УИ_ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не удалось прочитать тип из контейнера.");
			КонецПопытки;
		КонецЕсли;
	ИначеЕсли Параметры.Свойство("ХранилищеКонтейнераЗначенияОписанияТипа") Тогда 
		ВозвратХранилищаДляКонтейнераЗначения = Истина;
		ТипКонтейнераЗначения = УИ_ОбщегоНазначенияКлиентСервер.ТипыКонтейнеровЗначения().ОписаниеТипов;
		
		//@skip-check unknown-form-parameter-access
		ХранилищеКонтейнера = Параметры.ХранилищеКонтейнераЗначенияОписанияТипа;//см. УИ_ОбщегоНазначенияКлиентСервер.НовыйХранилищеЗначенияТипа
		Если ХранилищеКонтейнера <> Неопределено Тогда
			Попытка
				НачальныйТипДанных = УИ_ОбщегоНазначения.ЗначениеИзСтрокиXML(ХранилищеКонтейнера.Значение,
																			 Тип("ОписаниеТипов"));
			Исключение
				УИ_ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не удалось прочитать описание типов из контейнера.");
			КонецПопытки;
		КонецЕсли;
		
	КонецЕсли;
	ЗаполнитьСоставНачальногоОписанияТипов(НачальныйТипДанных);

	Если Параметры.Свойство("ОграничениеТипа") Тогда
		//@skip-check unknown-form-parameter-access
		ОграничениеТипаПараметр = Параметры.ОграничениеТипа;
		Если ТипЗнч(ОграничениеТипаПараметр) = Тип("ОписаниеТипов") Тогда
			ОграничениеТипа = УИ_ОбщегоНазначения.ЗначениеВСтрокуXML(ОграничениеТипаПараметр);
		ИначеЕсли ТипЗнч(ОграничениеТипаПараметр) = Тип("Строка") Тогда
			ОграничениеТипа = ОграничениеТипаПараметр;
		КонецЕсли;
	КонецЕсли;
	
	СоставнойТип = СоставНачальногоОписанияТипов.Количество() > 1;

	Если Параметры.Свойство("ДоступенСоставнойТип") Тогда
		//@skip-check unknown-form-parameter-access
		ДоступенСоставнойТип = Параметры.ДоступенСоставнойТип;
	Иначе
		ДоступенСоставнойТип = Истина;
	КонецЕсли;
	
	Если Параметры.Свойство("РежимВыбора") Тогда
		//@skip-check unknown-form-parameter-access
		РежимВыбора = Параметры.РежимВыбора;
		Если РежимВыбора Тогда
			ДоступенСоставнойТип = Ложь;
		КонецЕсли;
	Иначе
		РежимВыбора = Ложь;
	КонецЕсли;
	
	Если РежимВыбора Тогда
		Заголовок = "Выбор типа";
	КонецЕсли;
	
	Если Не ДоступенСоставнойТип Тогда
		СоставнойТип = Ложь;
		Элементы.СоставнойТип.Видимость = Ложь;
	КонецЕсли;
	
//	Элементы.ДеревоТиповВыбран.Видимость = Не РежимВыбора;
	Элементы.ГруппаВыбораФормыВыбораСсылочногоЗначения.Видимость = РежимВыбора
																   И Не ВозвратХранилищаДляКонтейнераЗначения;

	ЗаполнитьДанныеКвалификаторовПоПервоначальномуТипуДанных(НачальныйТипДанных);
	
	ЗаполнитьДеревоТипов(НачальныйТипДанных);
	
	УстановитьУсловноеОформление();
КонецПроцедуры


#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура НеограниченнаяДлинаСтрокиПриИзменении(Элемент)
	Если НеограниченнаяДлинаСтроки Тогда
		ДлинаСтроки=0;
		ДопустамаяДлинаСтрокиФиксированная=Ложь;
	КонецЕсли;
	Элементы.ДопустамаяДлинаСтрокиФиксированная.Доступность=Не НеограниченнаяДлинаСтроки;
КонецПроцедуры

&НаКлиенте
Процедура ДлинаСтрокиПриИзменении(Элемент)
	Если Не ЗначениеЗаполнено(ДлинаСтроки) Тогда
		НеограниченнаяДлинаСтроки=Истина;
		ДопустамаяДлинаСтрокиФиксированная=Ложь;
	Иначе
		НеограниченнаяДлинаСтроки=Ложь;
	КонецЕсли;
	Элементы.ДопустамаяДлинаСтрокиФиксированная.Доступность=Не НеограниченнаяДлинаСтроки;
КонецПроцедуры

&НаКлиенте
Процедура СтрокаПоискаПриИзменении(Элемент)
	ЗаполнитьДеревоТипов();
	РазвернутьЭлементыДерева();
КонецПроцедуры

&НаКлиенте
Процедура СоставнойТипПриИзменении(Элемент)
	Если Не СоставнойТип Тогда
		Если ВыбранныеТипы.Количество()=0 Тогда
			ДобавитьВыбранныйТип("Строка");
		КонецЕсли;
		Тип=ВыбранныеТипы[ВыбранныеТипы.Количество()-1];
		ВыбранныеТипы.Очистить();
		ДобавитьВыбранныйТип(Тип);
		
		УстановитьВыбранныеТипыВДереве(ДеревоТипов,ВыбранныеТипы);
	КонецЕсли;
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыДеревоТипов

&НаКлиенте
Процедура ДеревоТиповВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	ТекСтрока = ДеревоТипов.НайтиПоИдентификатору(ВыбраннаяСтрока);
	Если ТекСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ТекСтрока.Выбран = Истина;
	ОбработчикИзмененияПризнакаВыбораТипа(ТекСтрока);
	
	Если РежимВыбора И Не СоставнойТип Тогда
		ЗавершитьРедактированиеТипаИЗакрытьФорму();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ДеревоТиповВыбранПриИзменении(Элемент)
	ТекСтрока=Элементы.ДеревоТипов.ТекущиеДанные;
	Если ТекСтрока=Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ОбработчикИзмененияПризнакаВыбораТипа(ТекСтрока);	
КонецПроцедуры

&НаКлиенте
Процедура ДеревоТиповПриАктивизацииСтроки(Элемент)
	ТекДанные=Элементы.ДеревоТипов.ТекущиеДанные;
	Если ТекДанные=Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Элементы.ГруппаКвалификаторЧисла.Видимость=ТекДанные.Имя="Число";
	Элементы.ГруппаКвалификаторСтроки.Видимость=ТекДанные.Имя="Строка";
	Элементы.ГруппаКвалификаторДаты.Видимость=ТекДанные.Имя="Дата";
	
КонецПроцедуры



#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура Применить(Команда)
	ЗавершитьРедактированиеТипаИЗакрытьФорму();
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаСервере
Процедура ЗаполнитьСоставНачальногоОписанияТипов(Описание) 
	СоставНачальногоОписанияТипов.Очистить();
	СериализовннаяСтрока = УИ_ОбщегоНазначения.ЗначениеВСтрокуXML(Описание);
	
	ЧтениеXML = Новый ЧтениеXML();
	ЧтениеXML.УстановитьСтроку(СериализовннаяСтрока);
	
	ИмяУзла = "";
	Атрибуты = Новый Соответствие();
	ЭтоНабор = Ложь;
	ЭтоТипИзКонфигурации = Ложь;
	Пока ЧтениеXML.Прочитать() Цикл
		Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
			ИмяУзла = ЧтениеXML.Имя;
			Атрибуты = Новый Соответствие();
			Пока ЧтениеXML.ПрочитатьАтрибут() Цикл
				Атрибуты.Вставить(ЧтениеXML.Имя, ЧтениеXML.Значение);
			КонецЦикла;
			ЭтоНабор = Ложь;
			ЭтоТипИзКонфигурации = Ложь;

		ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда 

			Если ИмяУзла = "TypeSet" Тогда
				ТекИдентификатор = ЧтениеXML.Значение;
				ЭтоНабор = Истина;
			ИначеЕсли ИмяУзла = "Type" Тогда
				ТекИдентификатор = ЧтениеXML.Значение;
			Иначе
				Продолжить;
			КонецЕсли;
			
			Для Каждого КлючЗначение Из Атрибуты Цикл
				Если КлючЗначение.Значение = "http://v8.1c.ru/8.1/data/enterprise/current-config" Тогда
					ЭтоТипИзКонфигурации = Истина;
					Прервать;
				КонецЕсли;
			КонецЦикла;

			МассивТипа = СтрРазделить(ТекИдентификатор, ":");

			НоваяСтрока = СоставНачальногоОписанияТипов.Добавить();
			НоваяСтрока.Идентификатор = ТекИдентификатор;
			НоваяСтрока.ИдентификаторОчищенный = МассивТипа[МассивТипа.Количество() - 1];
			НоваяСтрока.ЭтоНабор = ЭтоНабор;
			НоваяСтрока.ЭтоТипКонфигурации = ЭтоТипИзКонфигурации;
			Если НоваяСтрока.ЭтоТипКонфигурации Тогда
				МассивИдентификатора = СтрРазделить(НоваяСтрока.ИдентификаторОчищенный, ".");
				НоваяСтрока.ИдентификаторТипаКонфигурацииДляПоиска = НРег(МассивИдентификатора[0]);
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Функция МассивВыбранныхТипов()
	МассивТипов=Новый Массив;
	
	МассивСоставныхТипов = Новый Массив;
	
	Для Каждого ЭлементТипа Из ВыбранныеТипы Цикл
		СтрокаТипа=ЭлементТипа.Значение;
		
		Если НРег(СтрокаТипа)="любаяссылка" Тогда
			МассивСоставныхТипов.Добавить(УИ_ОбщегоНазначенияКлиентСервер.ИдентификаторТипаЛюбаяСсылка());			
		ИначеЕсли СтрНайти(НРег(СтрокаТипа),"ссылка")>0 И СтрНайти(СтрокаТипа,".")=0 Тогда
			Если НРег(СтрокаТипа)="справочникссылка" Тогда
				МассивСоставныхТипов.Добавить(УИ_ОбщегоНазначенияКлиентСервер.ИдентификаторТипаСправочникСсылка());
			ИначеЕсли НРег(СтрокаТипа)="документссылка" Тогда	
				МассивСоставныхТипов.Добавить(УИ_ОбщегоНазначенияКлиентСервер.ИдентификаторТипаДокументСсылка());
			ИначеЕсли НРег(СтрокаТипа)="планвидовхарактеристикссылка" Тогда	
				МассивСоставныхТипов.Добавить(УИ_ОбщегоНазначенияКлиентСервер.ИдентификаторТипаПланВидовХарактеристикСсылка());
			ИначеЕсли НРег(СтрокаТипа)="плансчетовссылка" Тогда	
				МассивСоставныхТипов.Добавить(УИ_ОбщегоНазначенияКлиентСервер.ИдентификаторТипаПланСчетовСсылка());
			ИначеЕсли НРег(СтрокаТипа)="планвидоврасчетассылка" Тогда	
				МассивСоставныхТипов.Добавить(УИ_ОбщегоНазначенияКлиентСервер.ИдентификаторТипаПланВидовРасчетаСсылка());
			ИначеЕсли НРег(СтрокаТипа)="планобменассылка" Тогда	
				МассивСоставныхТипов.Добавить(УИ_ОбщегоНазначенияКлиентСервер.ИдентификаторТипаПланОбменаСсылка());
			ИначеЕсли НРег(СтрокаТипа)="перечислениессылка" Тогда	
				МассивСоставныхТипов.Добавить(УИ_ОбщегоНазначенияКлиентСервер.ИдентификаторТипаПеречислениеСсылка());
			ИначеЕсли НРег(СтрокаТипа)="бизнеспроцессссылка" Тогда	
				МассивСоставныхТипов.Добавить(УИ_ОбщегоНазначенияКлиентСервер.ИдентификаторТипаБизнессПроцессСсылка());
			ИначеЕсли НРег(СтрокаТипа)="задачассылка" Тогда	
				МассивСоставныхТипов.Добавить(УИ_ОбщегоНазначенияКлиентСервер.ИдентификаторТипаЗадачаСсылка());
			ИначеЕсли НРег(СтрокаТипа)="точкамаршрутабизнеспроцессассылка" Тогда
				МассивСоставныхТипов.Добавить(УИ_ОбщегоНазначенияКлиентСервер.ИдентификаторТипаТочкаМаршрутаБизнесПроцессаСсылка());
			КонецЕсли;
		ИначеЕсли ЭлементТипа.Пометка Тогда
			МассивИмени=СтрРазделить(СтрокаТипа,".");
			Если МассивИмени.Количество()<>2 Тогда
				Продолжить;
			КонецЕсли;
			ИмяОбъекта=МассивИмени[1];
			Если СтрНайти(НРег(СтрокаТипа),"характеристика")>0 Тогда
				МассивСоставныхТипов.Добавить(УИ_ОбщегоНазначенияКлиентСервер.ИдентификаторТипаХарактиристикаПланаВидовХарактеристик(ИмяОбъекта));
			ИначеЕсли СтрНайти(НРег(СтрокаТипа),"определяемыйтип")>0 Тогда
				МассивСоставныхТипов.Добавить(УИ_ОбщегоНазначенияКлиентСервер.ИдентификаторТипаОпределяемогоТипа(ИмяОбъекта));
			Иначе
				Продолжить;
			КонецЕсли;
		Иначе
			МассивТипов.Добавить(ЭлементТипа.Значение);
		КонецЕсли;
	КонецЦикла;
	
	Если МассивСоставныхТипов.Количество()>0 Тогда
		МассивТипов.Добавить(МассивСоставныхТипов);
	КонецЕсли;
	
	Возврат МассивТипов;
	
КонецФункции

&НаСервереБезКонтекста
Функция ВыбранноеОписаниеПлатформенныхСоставныхТипов(ТипыОписания)
	Возврат УИ_ОбщегоНазначения.ОписаниеТипаПоИдентификаторуТипа(ТипыОписания);
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ВыбранноеОписаниеТипов(Форма, МассивТипов)
	ТипыСтрокой=Новый Массив;
	ТипыТипом=Новый Массив;
	ТипыОписания = Неопределено;

	Для Каждого Тип Из МассивТипов Цикл
		Если ТипЗнч(Тип) = Тип("Тип") Тогда
			ТипыТипом.Добавить(Тип);
		ИначеЕсли ТипЗнч(Тип) = Тип("Массив") Тогда 
			ТипыОписания = Тип;
		Иначе
			ТипыСтрокой.Добавить(Тип);
		КонецЕсли;
	КонецЦикла;

	Если Форма.НеотрицательноеЧисло Тогда
		Знак=ДопустимыйЗнак.Неотрицательный;
	Иначе
		Знак=ДопустимыйЗнак.Любой;
	КонецЕсли;

	КвалификаторЧисла=Новый КвалификаторыЧисла(Форма.ДлинаЧисла, Форма.ТочностьЧисла, Знак);
	КвалификаторСтроки=Новый КвалификаторыСтроки(Форма.ДлинаСтроки, ?(Форма.ДопустамаяДлинаСтрокиФиксированная,
																	  ДопустимаяДлина.Фиксированная,
																	  ДопустимаяДлина.Переменная));
	
	Если Форма.СоставДаты = 1 Тогда
		ЧастьДаты=ЧастиДаты.Время;
	ИначеЕсли Форма.СоставДаты = 2 Тогда
		ЧастьДаты=ЧастиДаты.ДатаВремя;
	Иначе
		ЧастьДаты=ЧастиДаты.Дата;
	КонецЕсли;
	
	КвалификаторДаты=Новый КвалификаторыДаты(ЧастьДаты);

	Описание=Новый ОписаниеТипов;
	Если ТипыОписания <> Неопределено Тогда
		Описание = ВыбранноеОписаниеПлатформенныхСоставныхТипов(ТипыОписания);	
	КонецЕсли;
	Если ТипыТипом.Количество() > 0 Тогда
		Описание=Новый ОписаниеТипов(Описание, ТипыТипом, , КвалификаторЧисла, КвалификаторСтроки, КвалификаторДаты);
	КонецЕсли;
	Если ТипыСтрокой.Количество() > 0 Тогда
		Описание=Новый ОписаниеТипов(Описание, СтрСоединить(ТипыСтрокой, ","), , КвалификаторЧисла, КвалификаторСтроки,
			КвалификаторДаты);
	КонецЕсли;

	Возврат Описание;
КонецФункции

&НаСервере
Функция ВозвращаемоеХранилищеДляКонтейнера()
	МассивТипов=МассивВыбранныхТипов();
	
	Описание = ВыбранноеОписаниеТипов(ЭтотОбъект, МассивТипов);
	
	ХранилищеТипа = УИ_ОбщегоНазначенияКлиентСервер.НовыйХранилищеЗначенияТипа();
	ХранилищеТипа.Имя = Строка(Описание);
	
	ТипыКонтейнеров = УИ_ОбщегоНазначенияКлиентСервер.ТипыКонтейнеровЗначения();
	Если ТипКонтейнераЗначения = ТипыКонтейнеров.Тип Тогда
		Типы = Описание.Типы();
		Если Типы.Количество() =0  Тогда
			ТипВКонтейнер = Тип("Неопределено");
		Иначе
			ТипВКонтейнер = Типы[0];
		КонецЕсли;
		
		ХранилищеТипа.Значение = ЗначениеВСтрокуВнутр(ТипВКонтейнер);
	Иначе
		ХранилищеТипа.Значение = УИ_ОбщегоНазначения.ЗначениеВСтрокуXML(Описание);
	КонецЕсли;
	
	Возврат ХранилищеТипа;
КонецФункции

&НаКлиенте
Процедура ОбработчикИзмененияПризнакаВыбораТипа(ТекСтрока)
	
	Если ТекСтрока.Выбран Тогда
		Если Не СоставнойТип Тогда
			ВыбранныеТипы.Очистить();
		ИначеЕсли ТекСтрока.НедоступенДляСоставногоТипа Тогда
			Если ВыбранныеТипы.Количество() > 0 Тогда
				ПоказатьВопрос(Новый ОписаниеОповещения("ДеревоТиповВыбранПриИзмененииЗавершение", ЭтотОбъект,
					Новый Структура("ТекСтрока", ТекСтрока)), "Выбран тип, который не может быть включен в составной тип данных.
															  |Будут исключены остальные типы данных.
															  |Продолжить?", РежимДиалогаВопрос.ДаНет);
				Возврат;
			КонецЕсли;
		Иначе
			ЕстьНедоступныйДляСоставногоТипа=Ложь;
			Для Каждого Эл Из ВыбранныеТипы Цикл
				Если Эл.Пометка Тогда
					ЕстьНедоступныйДляСоставногоТипа=Истина;
					Прервать;
				КонецЕсли;
			КонецЦикла;
			
			Если ЕстьНедоступныйДляСоставногоТипа Тогда
				ПоказатьВопрос(Новый ОписаниеОповещения("ДеревоТиповВыбранПриИзмененииЗавершениеБылЗапрещенныйДляСоставногоТип",
					ЭтотОбъект, Новый Структура("ТекСтрока", ТекСтрока)), "Ранее был выбран тип, который не может быть 
																		  |включен в составной тип данных и будет исключен.
																		  |Продолжить?", РежимДиалогаВопрос.ДаНет);
				Возврат;
			КонецЕсли;
		КонецЕсли;
	Иначе
		Элемент=ВыбранныеТипы.НайтиПоЗначению(ТекСтрока.Имя);
		Если Элемент <> Неопределено Тогда
			ВыбранныеТипы.Удалить(Элемент);
		КонецЕсли;

	КонецЕсли;
	ДеревоТиповВыбранПриИзмененииФрагмент(ТекСтрока);

	
КонецПроцедуры

&НаКлиенте
Процедура ЗавершитьРедактированиеТипаИЗакрытьФорму()
	Если ВозвратХранилищаДляКонтейнераЗначения Тогда
		ВозвращаемоеЗначение = ВозвращаемоеХранилищеДляКонтейнера();
	Иначе
		МассивТипов=МассивВыбранныхТипов();
		
		Описание = ВыбранноеОписаниеТипов(ЭтотОбъект, МассивТипов);
		ВозвращаемоеЗначение = Описание;
		Если РежимВыбора Тогда
			ВозвращаемоеЗначение = Новый Структура;
			ВозвращаемоеЗначение.Вставить("Описание", Описание);
			ВозвращаемоеЗначение.Вставить("ИспользоватьДинамическийСписокДляВыбораСсылочногоЗначения",
										  ИспользоватьДинамическийСписокДляВыбораСсылочногоЗначения);
		КонецЕсли;
	КонецЕсли;
	
	Закрыть(ВозвращаемоеЗначение);
	
КонецПроцедуры

&НаСервере
Функция ДоступенНаборТипов(Набор)
	Возврат НаборТипов.НайтиПоЗначению(Набор) <> Неопределено;
КонецФункции

&НаСервере
Функция ДоступныеПримитивныеТипы()
	Возврат ДоступенНаборТипов(ДоступныеНаборыТипов.Примитивные);
КонецФункции

&НаСервере
Функция ДоступноХранилищеЗначений()
	Возврат НаборТипов.НайтиПоЗначению("ХРАНИЛИЩЕЗНАЧЕНИЙ") <> Неопределено;
КонецФункции

&НаСервере
Функция ДоступноNull()
	Возврат ДоступенНаборТипов("NULL");
КонецФункции

&НаСервере
Функция ДоступныСсылки()
	Возврат НаборТипов.НайтиПоЗначению("ССЫЛКИ") <> Неопределено;
КонецФункции

&НаСервере
Функция ДоступныСоставныеСсылки()
	Возврат НаборТипов.НайтиПоЗначению("СОСТАВНЫЕССЫЛКИ") <> Неопределено;
КонецФункции

&НаСервере
Функция ДоступенУникальныйИдентификатор()
	Возврат НаборТипов.НайтиПоЗначению("УНИКАЛЬНЫЙИДЕНТИФИКАТОР") <> Неопределено;
КонецФункции

&НаСервере
Функция ДоступныеКоллекцииЗначений()
	Возврат НаборТипов.НайтиПоЗначению("КОЛЛЕКЦИИЗНАЧЕНИЙ") <> Неопределено;
КонецФункции

&НаСервере
Функция ДоступенМоментВремени()
	Возврат НаборТипов.НайтиПоЗначению("МОМЕНТВРЕМЕНИ") <> Неопределено;
КонецФункции

&НаСервере
Функция ДоступенВыборТипаТип()
	Возврат НаборТипов.НайтиПоЗначению("ТИП") <> Неопределено;
КонецФункции

&НаСервере
Функция ДоступнаГраница()
	Возврат НаборТипов.НайтиПоЗначению("ГРАНИЦА") <> Неопределено;
КонецФункции

&НаСервере
Функция ДоступенСтандартныйПериод()
	Возврат НаборТипов.НайтиПоЗначению("СТАНДАРТНЫЙПЕРИОД") <> Неопределено;
КонецФункции

&НаСервере
Функция ДоступныСистемныеПеречисления()
	Возврат НаборТипов.НайтиПоЗначению("СИСТЕМНЫЕПЕРЕЧИСЛЕНИЯ") <> Неопределено;
КонецФункции

&НаСервере
Функция ДобавитьТипВДеревоТипов(НачальныйТипДанных, ИмяТипа, Картинка, ОписаниеОграниченияТипа, Представление = "",
	СтрокаДерева = Неопределено, ЭтоГруппа = Ложь, Групповой = Ложь, НедоступенДляСоставногоТипа = Ложь,
	ИдентификаторТипаВида = Неопределено)

	Если ЗначениеЗаполнено(Представление) Тогда
		ПредставлениеТипа=Представление;
	Иначе
		ПредставлениеТипа=ИмяТипа;
	КонецЕсли;

	Если ЗначениеЗаполнено(СтрокаПоиска) и Не Групповой Тогда
		Если СтрНайти(НРег(ПредставлениеТипа), НРег(СтрокаПоиска))=0 Тогда
			Возврат Неопределено;
		КонецЕсли;
	КонецЕсли;
	
	Если СтрокаДерева = Неопределено Тогда
		ЭлементДобавления=ДеревоТипов;
	Иначе
		ЭлементДобавления=СтрокаДерева;
	КонецЕсли;
	
	Попытка
		ТекТип=Тип(ИмяТипа);
	Исключение
		ТекТип=Неопределено;
	КонецПопытки;
	
	Если ТипЗнч(ОписаниеОграниченияТипа) = Тип("ОписаниеТипов") И ТекТип<>Неопределено Тогда
		Если Не ОписаниеОграниченияТипа.СодержитТип(ТекТип) Тогда
			Возврат Неопределено;
		КонецЕсли;
	КонецЕсли; 

	НоваяСтрока=ЭлементДобавления.ПолучитьЭлементы().Добавить();
	НоваяСтрока.Имя=ИмяТипа;
	НоваяСтрока.Представление=ПредставлениеТипа;
	НоваяСтрока.Картинка=Картинка;
	НоваяСтрока.ЭтоГруппа=ЭтоГруппа;
	НоваяСтрока.НедоступенДляСоставногоТипа=НедоступенДляСоставногоТипа;
	НоваяСтрока.Групповой = Групповой;

	Если НачальныйТипДанных <> Неопределено И (ТекТип <> Неопределено Или ЗначениеЗаполнено(ИдентификаторТипаВида)) Тогда
		Если ЗначениеЗаполнено(ИдентификаторТипаВида) Тогда
			СтруктураПоиска = Новый Структура;
			СтруктураПоиска.Вставить("ИдентификаторТипаКонфигурацииДляПоиска", НРег(ИдентификаторТипаВида));
			СтруктураПоиска.Вставить("ЭтоТипКонфигурации", Истина);

			ИмяПодтипа = ИдентификаторТипаВида;
			МассивИмени = СтрРазделить(ИмяТипа, ".");
			Если МассивИмени.Количество() = 2 Тогда
				ИмяПодтипа = ИмяПодтипа + "." + МассивИмени[1];
			КонецЕсли;

			ИмяПодтипа = НРег(ИмяПодтипа);

			НайденныеСтроки = СоставНачальногоОписанияТипов.НайтиСтроки(СтруктураПоиска);
			Для Каждого ТекСтр Из НайденныеСтроки Цикл
				Если НРег(ТекСтр.ИдентификаторОчищенный) = ИмяПодтипа Тогда
					ВыбранныеТипы.Добавить(НоваяСтрока.Имя, , НоваяСтрока.НедоступенДляСоставногоТипа);
					Прервать;
				КонецЕсли;				
			КонецЦикла;
		ИначеЕсли НачальныйТипДанных.СодержитТип(ТекТип) Тогда
			ВыбранныеТипы.Добавить(НоваяСтрока.Имя, , НоваяСтрока.НедоступенДляСоставногоТипа);
		КонецЕсли;
	КонецЕсли;

	
	Возврат НоваяСтрока;
КонецФункции

&НаСервере
Процедура ЗаполнитьТипыПоВидуОбъекта(ВидОбъектовМетаданных, ПрефиксТипа, Картинка, НачальныйТипДанных,
	ОписаниеОграниченияТипа, ИдентификаторТипаВида)
	КоллекцияОбъектов=Метаданные[ВидОбъектовМетаданных];

	СтрокаКоллекции=ДобавитьТипВДеревоТипов(НачальныйТипДанных,
											ПрефиксТипа,
											Картинка,
											ОписаниеОграниченияТипа,
											ПрефиксТипа,
											,
											,
											Истина,
											,
											ИдентификаторТипаВида);
											

	Для Каждого ОбъектМетаданных Из КоллекцияОбъектов Цикл
		ДобавитьТипВДеревоТипов(НачальныйТипДанных,
								ПрефиксТипа + "." + ОбъектМетаданных.Имя,
								Картинка,
								ОписаниеОграниченияТипа,
								ОбъектМетаданных.Имя,
								СтрокаКоллекции,
								,
								,
								,
								ИдентификаторТипаВида);
	КонецЦикла;
	
	УдалитьСтрокуДереваЕслиНетПодчиненныхПриПоиске(СтрокаКоллекции, ОписаниеОграниченияТипа);
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьПримитивныеТипы(НачальныйТипДанных, ОписаниеОграниченияТипа)
	//ДобавитьТипВДеревоТипов("Произвольный", БиблиотекаКартинок.УИ_ПроизвольныйТип);
	Если ДоступныеПримитивныеТипы() Тогда
		ДобавитьТипВДеревоТипов(НачальныйТипДанных, "Число", БиблиотекаКартинок.УИ_Число, ОписаниеОграниченияТипа);
		ДобавитьТипВДеревоТипов(НачальныйТипДанных, "Строка", БиблиотекаКартинок.УИ_Строка, ОписаниеОграниченияТипа);
		ДобавитьТипВДеревоТипов(НачальныйТипДанных, "Дата", БиблиотекаКартинок.УИ_Дата, ОписаниеОграниченияТипа);
		ДобавитьТипВДеревоТипов(НачальныйТипДанных, "Булево", БиблиотекаКартинок.УИ_Булево, ОписаниеОграниченияТипа);
	КонецЕсли;
	Если ДоступноХранилищеЗначений() Тогда
		ДобавитьТипВДеревоТипов(НачальныйТипДанных, "ХранилищеЗначения", Новый Картинка, ОписаниеОграниченияТипа);
	КонецЕсли;
	
	Если ДоступныеКоллекцииЗначений() Тогда
		ДобавитьТипВДеревоТипов(НачальныйТипДанных,
								"ТаблицаЗначений",
								БиблиотекаКартинок.УИ_ТаблицаЗначений,
								ОписаниеОграниченияТипа);
		ДобавитьТипВДеревоТипов(НачальныйТипДанных,
								"ДеревоЗначений",
								БиблиотекаКартинок.УИ_ТипДерево,
								ОписаниеОграниченияТипа);
		ДобавитьТипВДеревоТипов(НачальныйТипДанных,
								"СписокЗначений",
								БиблиотекаКартинок.УИ_СписокЗначений,
								ОписаниеОграниченияТипа);
		ДобавитьТипВДеревоТипов(НачальныйТипДанных, "Массив", БиблиотекаКартинок.УИ_Массив, ОписаниеОграниченияТипа);
		ДобавитьТипВДеревоТипов(НачальныйТипДанных, "Структура", Новый Картинка, ОписаниеОграниченияТипа);
		ДобавитьТипВДеревоТипов(НачальныйТипДанных, "Соответствие", Новый Картинка, ОписаниеОграниченияТипа);
	КонецЕсли;
	Если ДоступенВыборТипаТип() Тогда
		ДобавитьТипВДеревоТипов(НачальныйТипДанных, "Тип", БиблиотекаКартинок.ВыбратьТип, ОписаниеОграниченияТипа);
	КонецЕсли;
	Если ДоступенНаборТипов(ДоступныеНаборыТипов.ОписаниеТипов) Тогда
		ДобавитьТипВДеревоТипов(НачальныйТипДанных,
								"ОписаниеТипов",
								БиблиотекаКартинок.УИ_ОписаниеТипов,
								ОписаниеОграниченияТипа);
	КонецЕсли;

	Если ДоступенМоментВремени() Тогда
		ДобавитьТипВДеревоТипов(НачальныйТипДанных,
								"МоментВремени",
								БиблиотекаКартинок.УИ_МоментВремени,
								ОписаниеОграниченияТипа);
	КонецЕсли;
	Если ДоступнаГраница() Тогда
		ДобавитьТипВДеревоТипов(НачальныйТипДанных,
								"Граница",
								БиблиотекаКартинок.УИ_Граница,
								ОписаниеОграниченияТипа);
	КонецЕсли;
	Если ДоступенУникальныйИдентификатор() Тогда
		ДобавитьТипВДеревоТипов(НачальныйТипДанных,
								"УникальныйИдентификатор",
								БиблиотекаКартинок.УИ_УникальныйИдентификатор,
								ОписаниеОграниченияТипа);
	КонецЕсли;
	Если ДоступноNull() Тогда
		ДобавитьТипВДеревоТипов(НачальныйТипДанных, "Null", БиблиотекаКартинок.УИ_Null, ОписаниеОграниченияТипа);
	КонецЕсли;

	ЗаполнитьДополнительныеТипы(НачальныйТипДанных, ОписаниеОграниченияТипа);
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьТипыХарактеристик(НачальныйТипДанных, ОписаниеОграниченияТипа)
	Если Не ДоступныСоставныеСсылки() Тогда
		Возврат;
	КонецЕсли;
	//Характеристики
	ПланыВидов=Метаданные.ПланыВидовХарактеристик;
	Если ПланыВидов.Количество()=0 Тогда
		Возврат;
	КонецЕсли;
	
	СтрокаХарактеристик=ДобавитьТипВДеревоТипов(НачальныйТипДанных,
												"Характеристики",
												БиблиотекаКартинок.УИ_Папка,
												ОписаниеОграниченияТипа,
												,
												,
												Истина,
												Истина);
	
	Для Каждого План Из ПланыВидов Цикл
			ДобавитьТипВДеревоТипов(НачальныйТипДанных,
								"Характеристика." + План.Имя,
								Новый Картинка,
								ОписаниеОграниченияТипа,
								План.Имя,
								СтрокаХарактеристик,
								,
								,
								Истина,
								УИ_ОбщегоНазначенияКлиентСервер.ИдентификаторТипаХарактиристика());
	КонецЦикла;
	
	УдалитьСтрокуДереваЕслиНетПодчиненныхПриПоиске(СтрокаХарактеристик, ОписаниеОграниченияТипа);

КонецПроцедуры

&НаСервере
Процедура ЗаполнитьОпределяемыеТипы(НачальныйТипДанных, ОписаниеОграниченияТипа)
	Если Не ДоступныСоставныеСсылки() Тогда
		Возврат;
	КонецЕсли;
	
	//Характеристики
	Типы=Метаданные.ОпределяемыеТипы;
	Если Типы.Количество()=0 Тогда
		Возврат;
	КонецЕсли;
	
	СтрокаТипа=ДобавитьТипВДеревоТипов(НачальныйТипДанных,
									   "ОпределяемыйТип",
									   БиблиотекаКартинок.УИ_Папка,
									   ОписаниеОграниченияТипа,
									   ,
									   ,
									   Истина,
									   Истина);
	
	Для Каждого ОпределяемыйТип Из Типы Цикл
		ДобавитьТипВДеревоТипов(НачальныйТипДанных,
								"ОпределяемыйТип." + ОпределяемыйТип.Имя,
								Новый Картинка,
								ОписаниеОграниченияТипа,
								ОпределяемыйТип.Имя,
								СтрокаТипа,
								,
								,
								Истина,
								УИ_ОбщегоНазначенияКлиентСервер.ИдентификаторТипаОпределяемогоТипаБазовый());
	КонецЦикла;
	УдалитьСтрокуДереваЕслиНетПодчиненныхПриПоиске(СтрокаТипа, ОписаниеОграниченияТипа);
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьТипыСистемныеПеречисления(НачальныйТипДанных, ОписаниеОграниченияТипа)
	Если Не ДоступныСистемныеПеречисления() Тогда
		Возврат;
	КонецЕсли;
	СтрокаТипа=ДобавитьТипВДеревоТипов(НачальныйТипДанных,
									   "СистемныеПеречисления",
									   БиблиотекаКартинок.УИ_Папка,
									   ОписаниеОграниченияТипа,
									   "Системные перечисления",
									   ,
									   Истина,
									   Истина);

	ДобавитьТипВДеревоТипов(НачальныйТипДанных,
							"ВидДвиженияНакопления",
							БиблиотекаКартинок.УИ_ВидДвиженияНакопления,
							ОписаниеОграниченияТипа,
							,
							СтрокаТипа);
	ДобавитьТипВДеревоТипов(НачальныйТипДанных,
							"ВидСчета",
							БиблиотекаКартинок.ПланСчетовОбъект,
							ОписаниеОграниченияТипа,
							,
							СтрокаТипа);
	ДобавитьТипВДеревоТипов(НачальныйТипДанных,
							"ВидДвиженияБухгалтерии",
							БиблиотекаКартинок.ПланСчетов,
							ОписаниеОграниченияТипа,
							,
							СтрокаТипа);
	ДобавитьТипВДеревоТипов(НачальныйТипДанных,
							"ИспользованиеАгрегатаРегистраНакопления",
							Новый Картинка,
							ОписаниеОграниченияТипа,
							,
							СтрокаТипа);
	ДобавитьТипВДеревоТипов(НачальныйТипДанных,
							"ПериодичностьАгрегатаРегистраНакопления",
							Новый Картинка,
							ОписаниеОграниченияТипа,
							,
							СтрокаТипа);
	
	УдалитьСтрокуДереваЕслиНетПодчиненныхПриПоиске(СтрокаТипа, ОписаниеОграниченияТипа);
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьДополнительныеТипы(НачальныйТипДанных, ОписаниеОграниченияТипа)
	Если ДоступенНаборТипов(ДоступныеНаборыТипов.ТабличныйДокумент) Тогда
		ДобавитьТипВДеревоТипов(НачальныйТипДанных,
								"ТабличныйДокумент",
								БиблиотекаКартинок.ТабличныйДокументОтображатьЗаголовки,
								ОписаниеОграниченияТипа);
	КонецЕсли;
	Если ДоступенНаборТипов(ДоступныеНаборыТипов.Картинка) Тогда
		ДобавитьТипВДеревоТипов(НачальныйТипДанных,
								"Картинка",
								БиблиотекаКартинок.Картинка,
								ОписаниеОграниченияТипа);
	КонецЕсли;
	Если ДоступенНаборТипов(ДоступныеНаборыТипов.ДвоичныеДанные) Тогда
		ДобавитьТипВДеревоТипов(НачальныйТипДанных,
								"ДвоичныеДанные",
								Новый Картинка,
								ОписаниеОграниченияТипа);
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьФиксированныеКоллекции(НачальныйТипДанных, ОписаниеОграниченияТипа)
	Если Не	ДоступенНаборТипов(ДоступныеНаборыТипов.ФиксированныеКоллекцииЗначений) Тогда
		Возврат;
	КонецЕсли;
	
	ДобавитьТипВДеревоТипов(НачальныйТипДанных,
							"ФиксированныйМассив",
							БиблиотекаКартинок.УИ_ФиксированныйМассив,
							ОписаниеОграниченияТипа);
	ДобавитьТипВДеревоТипов(НачальныйТипДанных, "ФиксированнаяСтруктура",
							БиблиотекаКартинок.УИ_ФиксированныйМассив,
							ОписаниеОграниченияТипа);
	ДобавитьТипВДеревоТипов(НачальныйТипДанных,
							"ФиксированноеСоответствие",
							БиблиотекаКартинок.УИ_ФиксированныйМассив,
							ОписаниеОграниченияТипа);

КонецПроцедуры

&НаСервере
Процедура ЗаполнитьДеревоТипов(НачальныйТипДанных = Неопределено)
	ОписаниеОграниченияТипа = Неопределено;
	Если ЗначениеЗаполнено(ОграничениеТипа) Тогда
		//@skip-check empty-except-statement
		Попытка
			ОписаниеОграниченияТипа = УИ_ОбщегоНазначения.ЗначениеИзСтрокиXML(ОграничениеТипа, Тип("ОписаниеТипов"));
		Исключение
		КонецПопытки;
		Если ОписаниеОграниченияТипа = Новый ОписаниеТипов Тогда
			ОписаниеОграниченияТипа = Неопределено;
		КонецЕсли;
	КонецЕсли;
	
	ДеревоТипов.ПолучитьЭлементы().Очистить();
	ЗаполнитьПримитивныеТипы(НачальныйТипДанных, ОписаниеОграниченияТипа);
	ЗаполнитьТипыПоВидуОбъекта("Справочники",
							   "СправочникСсылка",
							   БиблиотекаКартинок.Справочник,
							   НачальныйТипДанных,
							   ОписаниеОграниченияТипа,
							   УИ_ОбщегоНазначенияКлиентСервер.ИдентификаторТипаСправочникСсылка());
	ЗаполнитьТипыПоВидуОбъекта("Документы",
							   "ДокументСсылка",
							   БиблиотекаКартинок.Документ,
							   НачальныйТипДанных,
							   ОписаниеОграниченияТипа,
							   УИ_ОбщегоНазначенияКлиентСервер.ИдентификаторТипаДокументСсылка());
	ЗаполнитьТипыПоВидуОбъекта("ПланыВидовХарактеристик",
							   "ПланВидовХарактеристикСсылка",
							   БиблиотекаКартинок.ПланВидовХарактеристик,
							   НачальныйТипДанных,
							   ОписаниеОграниченияТипа,
							   УИ_ОбщегоНазначенияКлиентСервер.ИдентификаторТипаПланВидовХарактеристикСсылка());
	ЗаполнитьТипыПоВидуОбъекта("ПланыСчетов", "ПланСчетовСсылка",
							   БиблиотекаКартинок.ПланСчетов,
							   НачальныйТипДанных,
							   ОписаниеОграниченияТипа,
							   УИ_ОбщегоНазначенияКлиентСервер.ИдентификаторТипаПланСчетовСсылка());
	ЗаполнитьТипыПоВидуОбъекта("ПланыВидовРасчета",
							   "ПланВидовРасчетаСсылка",
							   БиблиотекаКартинок.ПланВидовРасчета,
							   НачальныйТипДанных,
							   ОписаниеОграниченияТипа,
							   УИ_ОбщегоНазначенияКлиентСервер.ИдентификаторТипаПланВидовРасчетаСсылка());
	ЗаполнитьТипыПоВидуОбъекта("ПланыОбмена",
							   "ПланОбменаСсылка",
							   БиблиотекаКартинок.ПланОбмена,
							   НачальныйТипДанных,
							   ОписаниеОграниченияТипа,
							   УИ_ОбщегоНазначенияКлиентСервер.ИдентификаторТипаПланОбменаСсылка());
	ЗаполнитьТипыПоВидуОбъекта("Перечисления",
							   "ПеречислениеСсылка",
							   БиблиотекаКартинок.Перечисление,
							   НачальныйТипДанных,
							   ОписаниеОграниченияТипа,
							   УИ_ОбщегоНазначенияКлиентСервер.ИдентификаторТипаПеречислениеСсылка());
	ЗаполнитьТипыПоВидуОбъекта("БизнесПроцессы",
							   "БизнесПроцессСсылка",
							   БиблиотекаКартинок.БизнесПроцесс,
							   НачальныйТипДанных,
							   ОписаниеОграниченияТипа,
							   УИ_ОбщегоНазначенияКлиентСервер.ИдентификаторТипаБизнессПроцессСсылка());
	ЗаполнитьТипыПоВидуОбъекта("Задачи",
							   "ЗадачаСсылка",
							   БиблиотекаКартинок.Задача,
							   НачальныйТипДанных,
							   ОписаниеОграниченияТипа,
							   УИ_ОбщегоНазначенияКлиентСервер.ИдентификаторТипаЗадачаСсылка());
	//ЗаполнитьТипыПоВидуОбъекта("ТочкиМаршрутаБизнесПроцессаСсылка", "ТочкаМаршрутаБизнесПроцессаСсылка");
	
	ЗаполнитьТипыХарактеристик(НачальныйТипДанных, ОписаниеОграниченияТипа);
	//@skip-check empty-except-statement
	Попытка
		ЗаполнитьОпределяемыеТипы(НачальныйТипДанных, ОписаниеОграниченияТипа);
	Исключение
	КонецПопытки;
	Если ДоступныСоставныеСсылки() Тогда
		ДобавитьТипВДеревоТипов(НачальныйТипДанных,
								"ЛюбаяСсылка",
								Новый Картинка,
								ОписаниеОграниченияТипа,
								"Любая ссылка",
								,
								,
								,
								,
								УИ_ОбщегоНазначенияКлиентСервер.ИдентификаторТипаЛюбаяСсылка());
	КонецЕсли;
	ЗаполнитьФиксированныеКоллекции(НачальныйТипДанных, ОписаниеОграниченияТипа);
	Если ДоступенСтандартныйПериод() Тогда
		ДобавитьТипВДеревоТипов(НачальныйТипДанных,
								"СтандартнаяДатаНачала",
								Новый Картинка,
								ОписаниеОграниченияТипа,
								"Стандартный дата начала");
		ДобавитьТипВДеревоТипов(НачальныйТипДанных,
								"СтандартныйПериод",
								Новый Картинка,
								ОписаниеОграниченияТипа,
								"Стандартный период");
	КонецЕсли;
	ЗаполнитьТипыСистемныеПеречисления(НачальныйТипДанных, ОписаниеОграниченияТипа);
	
	УстановитьВыбранныеТипыВДереве(ДеревоТипов,ВыбранныеТипы);
КонецПроцедуры

&НаСервере
Процедура УстановитьУсловноеОформление()
	// Группы нелья выбирать
	НовоеУО=УсловноеОформление.Элементы.Добавить();
	НовоеУО.Использование=Истина;
	УИ_ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(НовоеУО.Отбор,
		"Элементы.ДеревоТипов.ТекущиеДанные.ЭтоГруппа", Истина);
	Поле=НовоеУО.Поля.Элементы.Добавить();
	Поле.Использование=Истина;
	Поле.Поле=Новый ПолеКомпоновкиДанных("ДеревоТиповВыбран");

	Оформление=НовоеУО.Оформление.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Отображать"));
	Оформление.Использование=Истина;
	Оформление.Значение=Ложь;
	
	// Если строка неограниченная то нельзя менять допустимую длину строки
	НовоеУО=УсловноеОформление.Элементы.Добавить();
	НовоеУО.Использование=Истина;
	УИ_ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(НовоеУО.Отбор,
		"ДлинаСтроки", 0);
	Поле=НовоеУО.Поля.Элементы.Добавить();
	Поле.Использование=Истина;
	Поле.Поле=Новый ПолеКомпоновкиДанных("ДопустамаяДлинаСтрокиФиксированная");

	Оформление=НовоеУО.Оформление.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ТолькоПросмотр"));
	Оформление.Использование=Истина;
	Оформление.Значение=Истина;
	
	Если РежимВыбора Тогда
		НовоеУО=УсловноеОформление.Элементы.Добавить();
		НовоеУО.Использование=Истина;
		УИ_ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(НовоеУО.Отбор,
			"Элементы.ДеревоТипов.ТекущиеДанные.Групповой", Истина);
		Поле=НовоеУО.Поля.Элементы.Добавить();
		Поле.Использование=Истина;
		Поле.Поле=Новый ПолеКомпоновкиДанных("ДеревоТиповВыбран");

		Оформление=НовоеУО.Оформление.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Отображать"));
		Оформление.Использование=Истина;
		Оформление.Значение=Ложь;

	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура УдалитьСтрокуДереваЕслиНетПодчиненныхПриПоиске(СтрокаДерева, ОписаниеОграниченияТипа)
	Если Не ЗначениеЗаполнено(СтрокаПоиска) И ОписаниеОграниченияТипа = Неопределено Тогда
		Возврат;
	КонецЕсли;
	Если СтрокаДерева.ПолучитьЭлементы().Количество()=0 Тогда
		ДеревоТипов.ПолучитьЭлементы().Удалить(СтрокаДерева);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура РазвернутьЭлементыДерева()
	Для каждого СтрокаДерева Из ДеревоТипов.ПолучитьЭлементы() Цикл 
		Элементы.ДеревоТипов.Развернуть(СтрокаДерева.ПолучитьИдентификатор());
	КонецЦикла;
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьВыбранныеТипыВДереве(СтрокаДерева,ВыбранныеТипы)
	Для Каждого Стр ИЗ СтрокаДерева.ПолучитьЭлементы() Цикл
		Стр.Выбран=ВыбранныеТипы.НайтиПоЗначению(Стр.Имя)<>Неопределено;
		
		УстановитьВыбранныеТипыВДереве(Стр, ВыбранныеТипы);
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьВыбранныйТип(СтрокаДереваИлиТип)
	Если ТипЗнч(СтрокаДереваИлиТип)=Тип("Строка") Тогда
		ИмяТипа=СтрокаДереваИлиТип;
		НедоступенДляСоставногоТипа=Ложь;
	ИначеЕсли ТипЗнч(СтрокаДереваИлиТип)=Тип("ЭлементСпискаЗначений") Тогда
		ИмяТипа=СтрокаДереваИлиТип.Значение;
		НедоступенДляСоставногоТипа=СтрокаДереваИлиТип.Пометка;
	Иначе
		ИмяТипа=СтрокаДереваИлиТип.Имя;
		НедоступенДляСоставногоТипа=СтрокаДереваИлиТип.НедоступенДляСоставногоТипа;
	КонецЕсли;
	
	Если ВыбранныеТипы.НайтиПоЗначению(ИмяТипа)=Неопределено Тогда
		ВыбранныеТипы.Добавить(ИмяТипа,,НедоступенДляСоставногоТипа);
	КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ДеревоТиповВыбранПриИзмененииЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
	
	Ответ=РезультатВопроса;
	
	Если Ответ=КодВозвратаДиалога.Нет Тогда
		ДополнительныеПараметры.ТекСтрока.Выбран=Ложь;
		Возврат;
	КОнецЕсли;

	ВыбранныеТипы.Очистить();
	ДеревоТиповВыбранПриИзмененииФрагмент(ДополнительныеПараметры.ТекСтрока);
КонецПроцедуры
&НаКлиенте
Процедура ДеревоТиповВыбранПриИзмененииЗавершениеБылЗапрещенныйДляСоставногоТип(РезультатВопроса, ДополнительныеПараметры) Экспорт
	
	Ответ=РезультатВопроса;
	
	Если Ответ=КодВозвратаДиалога.Нет Тогда
		ДополнительныеПараметры.ТекСтрока.Выбран=Ложь;
		Возврат;
	КОнецЕсли;

	МассивУдаляемыхЭлементов=Новый Массив;
	Для Каждого Эл Из ВыбранныеТипы Цикл 
		Если Эл.Пометка Тогда
			МассивУдаляемыхЭлементов.Добавить(Эл);
		КонецЕсли;
	КонецЦикла;
	
	Для Каждого Эл Из  МассивУдаляемыхЭлементов Цикл
		ВыбранныеТипы.Удалить(Эл);
	КонецЦикла;
	
	ДеревоТиповВыбранПриИзмененииФрагмент(ДополнительныеПараметры.ТекСтрока);
КонецПроцедуры

&НаКлиенте
Процедура ДеревоТиповВыбранПриИзмененииФрагмент(ТекСтрока) Экспорт
		
	Если ТекСтрока.Выбран Тогда
		ДобавитьВыбранныйТип(ТекСтрока);
	КонецЕсли;

	Если ВыбранныеТипы.Количество()=0 Тогда
		ДобавитьВыбранныйТип("Строка");
	КонецЕсли;
	
	УстановитьВыбранныеТипыВДереве(ДеревоТипов,ВыбранныеТипы);
КонецПроцедуры


&НаСервере
Процедура ЗаполнитьДанныеКвалификаторовПоПервоначальномуТипуДанных(НачальныйТипДанных)
	ДлинаЧисла=НачальныйТипДанных.КвалификаторыЧисла.Разрядность;
	ТочностьЧисла=НачальныйТипДанных.КвалификаторыЧисла.РазрядностьДробнойЧасти;
	НеотрицательноеЧисло= НачальныйТипДанных.КвалификаторыЧисла.ДопустимыйЗнак=ДопустимыйЗнак.Неотрицательный;
	
	ДлинаСтроки=НачальныйТипДанных.КвалификаторыСтроки.Длина;
	НеограниченнаяДлинаСтроки=Не ЗначениеЗаполнено(ДлинаСтроки);
	ДопустамаяДлинаСтрокиФиксированная=НачальныйТипДанных.КвалификаторыСтроки.ДопустимаяДлина=ДопустимаяДлина.Фиксированная;

	Если НачальныйТипДанных.КвалификаторыДаты.ЧастиДаты=ЧастиДаты.Время Тогда
		СоставДаты= 1;
	ИначеЕсли НачальныйТипДанных.КвалификаторыДаты.ЧастиДаты=ЧастиДаты.ДатаВремя Тогда
		СоставДаты=2;
	КонецЕсли;
КонецПроцедуры

#КонецОбласти